/*******************************************************************

   DOExchange.h
   
*********************************************************************/

#include "includes/Project.h"

#define CONFIG_FILE "DOpus5:Settings/DOExchange.prefs"

/********************************************************************/
// some defines for IPC_Commands
// our template was
// "Hide/S,Show/S,BGC=BackgroundColour/N,TC=TextColour/N,N=NewName/K,Quit/S"

#define IPCCMD_HIDE   1 << 0
#define IPCCMD_SHOW   1 << 1
#define IPCCMD_BGC    1 << 2
#define IPCCMD_TC     1 << 3
#define IPCCMD_NAME   1 << 4
#define IPCCMD_QUIT   1 << 5

#define ARG_BGC       fargs->FA_Arguments[2]
#define ARG_TC        fargs->FA_Arguments[3]
#define ARG_NAME      fargs->FA_Arguments[4]

#define POPID_SAVE    0xFFF0
#define POPID_QUIT    0xFFF1

#define CXID_USER     100 

/********************************************************************/
// some structures

// since the Amiga developers did mean noone else should do an
// Exchange program, the next both structures are the results of some
// experiments and may (does) not match the real structures,
// but I think I've got what I need :)

// a kind of CxMsg
typedef struct
{
   struct Message msg; // ln_Type should be NT_MESSAGE
   
   ULONG a;
   ULONG ID;   // message id
   UBYTE c;  
   UBYTE d;
   UBYTE Code; // message type
   
}  FakeMsg;

// a kind of CxObj
typedef struct
{
   char dummy1[14];
   UBYTE flags;
   char dummy2[125];
   struct MsgPort *cx_port;
}  CX_OBJ;


// and now back to "normal" stuctures
typedef struct _SubMenu_Node
{
   struct MinNode minnode;
   struct MinList submenu;
   
}  SubMenu_Node;

typedef struct _DOE_Data
{
   ULONG a4;
   struct Library *module;
   struct Library *library;
   IPCData *ipc;
      
   APTR messages;
   
   APTR notify_handle;
   struct MsgPort *notify_port;
         
   struct Screen *screen;
   
   struct NewBroker nb;
      
   struct MsgPort *sender;
   FakeMsg        *fmsg;
   
   PopUpMenu popmenu;
   PopUpItem *popitem;
   PopUpItem *compare;
   
   struct MinList submenus;
   SubMenu_Node *submenu_node;
   
   struct Node *ptr_node;
   
   ULONG entry_count;
   ULONG signals;
   BOOL stop;
   USHORT flags;
         
   CxObj *our_cxobj;
   CxObj *filter;
   CxObj *new_obj;
   
   struct Window *win;
   WindowID id;
   struct IBox ibox;
   struct IntuiText itext;
   char name[16];
         
}  DOE_Data; 

typedef struct _PassData
{
   UBYTE FrontPen;
   UBYTE BackPen;
   STRPTR name;
   
}  PassData;
   

struct Gadget draggadget =
{
   NULL,
   0, 0, 0, 0, 
   GFLG_GADGHNONE | GFLG_RELWIDTH | GFLG_RELHEIGHT,
   GACT_RELVERIFY, GTYP_WDRAGGING,
   NULL, NULL, NULL, NULL,
   NULL, NULL, NULL
};

void DOExchange( STRPTR args, struct Screen *screen, IPCData *ipc );